// 一、异或(^)

// 1. 不用额外变量进行两个数交换

let a = 1;
let b = 2;

a ^= b;
b ^= a;
a ^= b;
console.log(a);
console.log(b);

// 2. 一个数组中有一种数出现了奇数次，其他数都出现了偶数次，怎么找到并打印这种数

console.log([1, 2, 3, 1, 2, 3, 1].reduce((a, b) => a ^ b));

// 3. 提取出最右侧的1来

let c = 0b110010;

console.log(c & (~c + 1));

// 4. 一个数组中有两种数出现了奇数次，其他数都出现了偶数次，怎么找到并打印这两种数

const nums = [6, 6, 6, 3, 3, 8];
const eor = nums.reduce((a, b) => a ^ b);
console.log(eor.toString(2));

// 一、与(^)

// 1. 布赖恩·克尼根算法，1的位数

let v = 0b110001;
let count = 0;
while (v) {
  count++;
  v = v & (v - 1);
}

console.log(count);